package com.dindang.ddm.app;

import android.app.Application;
import android.content.Context;
import android.support.v4.app.FragmentManager;

import com.dindang.ddm.BuildConfig;
import com.dindang.ddm.mvp.model.api.Api;
import com.dindang.ddm.mvp.model.api.fastjson.FastJsonConverterFactory;
import com.dindang.maintenance.mvp.model.api.MaintainApi;
import com.dindang.propertyfee.mvp.model.api.PropertyfeeApi;
import com.jess.arms.base.delegate.AppLifecycles;
import com.jess.arms.di.module.GlobalConfigModule;
import com.jess.arms.http.imageloader.glide.GlideImageLoaderStrategy;
import com.jess.arms.http.log.RequestInterceptor;
import com.jess.arms.integration.ConfigModule;

import java.util.List;
import java.util.concurrent.TimeUnit;

import me.jessyan.progressmanager.ProgressManager;
import me.jessyan.retrofiturlmanager.RetrofitUrlManager;

/**
 * Created by cxw on & 2018/9/27
 */
public class GlobalConfiguration implements ConfigModule {
    @Override
    public void applyOptions(Context context, GlobalConfigModule.Builder builder) {
        if (!BuildConfig.LOG_DEBUG) { //Release 时,让框架不再打印 Http 请求和响应的信息
            builder.printHttpLogLevel(RequestInterceptor.Level.NONE);
        }
        builder.baseurl(Api.APP_DOMAIN)
            //强烈建议自己自定义图片加载逻辑, 因为 arms-imageloader-glide 提供的 GlideImageLoaderStrategy 并不能满足复杂的需求
            //请参考 https://github.com/JessYanCoding/MVPArms/wiki#3.4
            .imageLoaderStrategy(new GlideImageLoaderStrategy())

            // 这里提供一个全局处理 Http 请求和响应结果的处理类,可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
            .globalHttpHandler(new GlobalHttpHandlerImpl(context))
            // 用来处理 rxjava 中发生的所有错误,rxjava 中发生的每个错误都会回调此接口
            // rxjava必要要使用ErrorHandleSubscriber(默认实现Subscriber的onError方法),此监听才生效
            .responseErrorListener(new ResponseErrorListenerImpl())
            .gsonConfiguration((context1, gsonBuilder) -> {//这里可以自己自定义配置Gson的参数
                gsonBuilder
                        .serializeNulls()//支持序列化null的参数
                        .enableComplexMapKeySerialization();//支持将序列化key为object的map,默认只能序列化key为string的map
            })
            .retrofitConfiguration((context1, retrofitBuilder) -> {//这里可以自己自定义配置Retrofit的参数, 甚至您可以替换框架配置好的 OkHttpClient 对象 (但是不建议这样做, 这样做您将损失框架提供的很多功能)
                retrofitBuilder.addConverterFactory(FastJsonConverterFactory.create());//比如使用fastjson替代gson
            })
            .okhttpConfiguration((context1, okhttpBuilder) -> {//这里可以自己自定义配置Okhttp的参数
    //                    okhttpBuilder.sslSocketFactory(); //支持 Https,详情请百度
                okhttpBuilder.writeTimeout(10, TimeUnit.SECONDS);
                //使用一行代码监听 Retrofit／Okhttp 上传下载进度监听,以及 Glide 加载进度监听 详细使用方法查看 https://github.com/JessYanCoding/ProgressManager
                ProgressManager.getInstance().with(okhttpBuilder);
                //让 Retrofit 同时支持多个 BaseUrl 以及动态改变 BaseUrl. 详细使用请方法查看 https://github.com/JessYanCoding/RetrofitUrlManager
                RetrofitUrlManager.getInstance().with(okhttpBuilder);
                RetrofitUrlManager.getInstance().putDomain(MaintainApi.APP_NAME, Api.APP_DOMAIN);// 维修管理
                RetrofitUrlManager.getInstance().putDomain(PropertyfeeApi.APP_NAME, Api.APP_DOMAIN);// 物业收费
            })
            .rxCacheConfiguration((context1, rxCacheBuilder) -> {//这里可以自己自定义配置 RxCache 的参数
                rxCacheBuilder.useExpiredDataIfLoaderNotAvailable(true);
                // 想自定义 RxCache 的缓存文件夹或者解析方式, 如改成 fastjson, 请 return rxCacheBuilder.persistence(cacheDirectory, new FastJsonSpeaker());
                // 否则请 return null;
                return null;
            });
    }

    @Override
    public void injectAppLifecycle(Context context, List<AppLifecycles> lifecycles) {
        lifecycles.add(new AppLifecyclesImpl());
    }

    @Override
    public void injectActivityLifecycle(Context context, List<Application.ActivityLifecycleCallbacks> lifecycles) {
        lifecycles.add(new ActivityLifecycleCallbacksImpl());
    }

    @Override
    public void injectFragmentLifecycle(Context context, List<FragmentManager.FragmentLifecycleCallbacks> lifecycles) {
        lifecycles.add(new FragmentLifecycleCallbacksImpl());
    }

}
